package keyword

import (
	"math"
)

// CalculateArea 计算面积接口
type CalculateArea interface {
	Area() float64
	Perimeter() float64
}

// Circular 圆形结构体
type Circular struct {
	// 半径
	Radius float64
}

// Area 计算面积
func (c Circular) Area() float64 {
	return math.Pi * c.Radius * c.Radius
}

// Perimeter 计算周长
func (c Circular) Perimeter() float64 {
	return 2 * math.Pi * c.Radius
}

// Triangle 结构体表示三角形
type Triangle struct {
	Base   float64
	Height float64
	C      []float64
}

// Area 计算面积
func (t Triangle) Area() float64 {
	return 0.5 * t.Base * t.Height
}

// Perimeter 计算周长
func (t Triangle) Perimeter() float64 {
	var c float64
	for _, v := range t.C {
		c += v
	}
	return c
}

// Rectangle 矩形结构体
type Rectangle struct {
	Height float64
	Width  float64
}

// Area 计算面积
func (r Rectangle) Area() float64 {
	return r.Height * r.Height
}

// Perimeter 计算周长
func (r Rectangle) Perimeter() float64 {
	return (r.Height + r.Width) * 2
}

// Trapezoid 梯形结构体
type Trapezoid struct {
	TopBase    float64
	BottomBase float64
	Height     float64
	WaistLineA float64
	WaistLineB float64
}

// Area 计算面积
func (t Trapezoid) Area() float64 {
	return (t.TopBase + t.BottomBase) * 0.5 * t.Height
}

// Perimeter 计算周长
func (t Trapezoid) Perimeter() float64 {
	return t.TopBase + t.BottomBase + t.WaistLineA + t.WaistLineB
}

// GeometricShapes 几何结构体
type GeometricShapes struct {
	Title           string
	CalculateTarget string
	Calculate       CalculateArea
}

// SetGeometricArea 设置执行策略
func (g *GeometricShapes) SetGeometricArea(calculate CalculateArea) {
	g.Calculate = calculate
}

// GetGeometricArea 获取面积
func (g *GeometricShapes) GetGeometricArea() float64 {
	if g.Calculate == nil {
		return 0
	}
	return g.Calculate.Area()
}

// GetGeometricPerimeter 获取周长
func (g *GeometricShapes) GetGeometricPerimeter() float64 {
	return g.Calculate.Perimeter()
}
